Este notebook presenta un análisis del índice de ruido \(LA_{eq}^{(i)}\) en la ciudad de Madrid para los años 2015-2019, ambos incluidos, y el año 2020 hasta el mes de mayo.

  1. En la primera parte se presentan una comparativa de las 31 estaciones presentes en la capital. Observaremos cómo el ruido es estacional en prácticamente todas ellas, las ordenaremos de acuerdo al ruido medio diario que registran y veremos, mediante un gráfico de violín, las desviaciones de todos los registros con respecto a la media diaria para cada una de las estaciones.

  2. En la segunda parte, compararemos la evolución de la media mensual del índice \(LA_{eq}\) para las distintas estaciones, permitiéndonos observar un claro descenso en el año 2020 debido a las medidas de aislamiento establecidas por la crisis de la pandemia COVID-19. Posteriormente, descenderemos a una escala diaria para analizar en detalle el efecto de las distintas etapas del aislamiento sobre el ruido registrado en las estaciones de Madrid.

i El índice de ruido \(LA_{eq}\) es el parámetro acústico aceptado internacionalmente como medida del nivel sonoro continuo equivalente. Este índice representa la contaminación acústica acumulada a lo largo de un periodo de tiempo en el lugar de medición. Puesto que el oído humano es más sensible a las medias frecuencias, se realiza una ponderación de frecuencias, dando menos importancia a las bajas y altas frecuencias frente a las medias, con el fin de establecer una medida del nivel de ruido que soporta el ser humano cercano a la estación de medición.

Análisis realizado por Claudia Gutiérrez y Diego Duque

Los datos han sido obtenido del Portal de datos abiertos del Ayuntamiento de Madrid.

library("dplyr")
library("ggplot2")
library("gridExtra")
library("reshape2")
library("magrittr")
library("lattice")
library("latticeExtra")
library("zoo")
library("viridis")
Sys.setlocale("LC_TIME", "en_US.UTF-8")
[1] "en_US.UTF-8"
# Set the minimal set for the graphs
theme_set(theme_minimal() + theme(legend.position = "top"))
# Load data
df <- read.csv(file = './data/datos_ruido_madrid.csv', header = FALSE, sep = ';', strip.white = TRUE)
# Rename columns
colnames(df) <- c("Station","Year","Month","Day","Period","LAeq","LAS01","LAS10","LAS50","LAS90","LAS99")
# Create column date
df$Date <- as.Date(with(df, paste(Year, Month, Day,sep="-")), "%Y-%m-%d")
# Create column with the name of the months
df$MonthName <- months(df$Date)
# Create column with day of week and month. 
df$DayMonthName <- with(df, paste(weekdays(df$Date), MonthName,sep="-"))
# Delete useless columns
df$LAS01 <- NULL
df$LAS10 <- NULL
df$LAS50 <- NULL
df$LAS90 <- NULL
df$LAS99 <- NULL
head(df)
# Load stations file
dfs <- read.csv(file = './data/EstacionesMedidaControlAcustico.csv', header = TRUE, sep = ',', strip.white = TRUE, fileEncoding = "ISO-8859-1")
# Delete useless columns
dfs[ ,c('COD_VIA', 'VIA_CLASE','VIA_PAR','VIA_NOMBRE','Dirección','Longitud_gms','Latitud_gms','LATITUD_ED50','LONGITUD_ED50','Alt..m.','Fecha.alta','Coordenada_X_ETRS89','Coordenada_Y_ETRS89','LONGITUD_WGS84','LATITUD_WGS84','X.2','X.3')] <- list(NULL)
# Rename some columns
dfs <- dfs %>% 
  rename(
    Station=Nº,
    StationName = Nombre,
    Long = X, 
    Lat = X.1
    )
head(dfs)
# Merge dataframes
df <- merge(df, dfs, by = "Station", all.x = TRUE)
# Sort output dataframe
df <- df[order(df$Date),]
head(df)

A continuación se muestran los registros del índice \(LA_{eq}\) medidos por todas las estaciones a lo largo de los años para los distintos periodos. Se observa que durante las noches (N) el índice es inferior en todas la estaciones. Por otro lado, en algunas estaciones apenas hay distinción en el índice de ruido medido en los periodos D y E (mañana y tarde, respectivamente).

Además, se aprecia con claridad cómo el índice de ruido es estacional (se repite el mismo patrón de año en año), si bien se observan diferencias para el año 2020 debido a las medidas de confinamiento para paliar el efecto de la pandemia COVID-19.

Los picos observados seguramente sean debidos a errores en la medición del ruido.

ggplot(df[df$Period != "T", ], aes(x = Date, y = LAeq, group=Period)) +
  geom_line(aes(color=Period), alpha=0.8, lwd = 0.3)  +
  facet_wrap(~ StationName, ncol = 3, scales="free_x") +
  ylim(30,90) +
  labs(title = "Evolución del índice LAeq para los periodos día (D), tarde (E) y noche (N)", y = "LAeq") +
  scale_x_date(date_breaks = "years", date_labels = "%Y")

Realizamos la media del índice \(LA_{eq}\) en el periodo T a lo largo de los años 2015-2019 (ambos incluidos) para cada una de las estaciones. De esta manera podemos ver cuáles son las estaciones que generalmente son más ruidosas.

dfToPlot <-df %>% 
  filter(Year != 2020) %>%
  filter(Period == "T") %>%
  group_by(StationName) %>%
  summarise(mean_LAeq = mean(LAeq))
ggplot(dfToPlot,aes(y=reorder(StationName, mean_LAeq, mean),x=mean_LAeq, color=mean_LAeq)) +
  geom_point(cex=2.5) +
  scale_color_viridis(option = "D") +
  labs(y="Stations", x = "Mean LAeq") +
  theme(legend.position = "right")

df %>%
  filter(Year != 2020) %>%
    filter(Period == "T") %>%
    group_by(Station) %>%
  ggplot(aes(x=reorder(StationName, LAeq, mean), y=LAeq)) +
  geom_violin(trim=FALSE) +
  geom_boxplot(width=0.2, outlier.shape=NA) +
  labs(color='Station', x='') +
  theme(axis.text.x = element_text(angle = 90))

Después de este análisis general nos centramos únicamente en el periodo T. Comenzaremos calculando la media mensual del índice \(LA_{eq}\) para todos los años y estaciones. De esta manera nos permitirá analizar grosso modo las diferencias y similitudes entre los años 2014-2020 (ambos incluidos).

# Compute the mean of the index by year, month, station and period
meanLAeqByMonthStationAndPeriod <- df %>% 
    group_by(Year,MonthName, StationName, Period) %>% 
    summarise(meanLAeqByMonth = mean(LAeq))
# Merge dataframes
df <- merge(df, meanLAeqByMonthStationAndPeriod, by = c("Year","MonthName", "StationName", "Period"), all.x = TRUE)
head(df)
# Filter period
 dfPeriodT <- df %>% filter(Period == "T")
# Take only the unique data
dfMeanLAeqByMonth <- distinct(dfPeriodT, Year, MonthName, StationName, meanLAeqByMonth)
# Year as factor in order to facilitate the choice of colors in the plot
dfMeanLAeqByMonth$Year <- factor(dfMeanLAeqByMonth$Year)

De la gráfica siguiente se pueden extraer las siguientes conclusiones conclusiones:

  1. La curva del ruido promediada mensualmente tiene una estructura similar año tras año para prácticamente todas las estaciones.

  2. Se puede aprecia un ligero descenso en el ruido durante el año 2019 en estaciones como Plaza de España, Manuel Becerra, Embajada. Podría pensarse que el efecto de Madrid Central llegara hasta dichas estaciones si tuviéramos más años (previos y posteriores a Madrid Central).

  3. El año 2020 comenzó de forma similar al resto de años. Sin embargo, a partir de abril, los niveles de ruido descendieron debido a las medidas de confinamiento.

ggplot(dfMeanLAeqByMonth, aes(x = ordered(MonthName,levels=month.name), y = meanLAeqByMonth, group=Year)) +
  geom_point(aes(color=Year), size=2)  +
  geom_line(aes(color=Year))  +
  facet_wrap(~ StationName, ncol = 3, scales="free") +
  labs(title = "Comparación del índice LAeq medido en las distintas estaciones a lo largo de los años",
       subtitle = "Se ha realizado la media mensual de los datos recopilados en cada una de las estaciones",
       y = "Monthly mean LAeq", x = 'Month') +
 theme(legend.position="top")

Una vez que hemos visto cómo el efecto de la cuarentena debido al coronavirus se refleja en los niveles de ruido, nos centramos únicamente en el periodo de tiempo durante el cual fueron aplicadas las medidas de confinamiento e hibernación de la economía. Para ello estudiaremos los niveles de ruido con un nivel de descripción semanal.

Para ello crearemos obtendremos los promedios diarios de los índices de los años 2015-2019 teniendo en cuenta las siguientes premisas:

  1. Los promedios se tienen que realizar no por fecha sino por días (i.e. se promedian los días de la semana de un mismo mes). Así pues, tomaremos, por ejemplo, todos los lunes de un mismo mes de los distintos años para realizar el promedio y obtener un lunes “típico” del mes en cuestión.

  2. Construiremos un mes “típico” para compararlo con el mes correspondiente de 2020.

  3. El efecto de Madrid central observado en la gráfica anterior no va a ser tenido en cuenta ya que vamos a promediar sobre todos los años previos al de la crisis del coronavirus.

head(df)

Calculamos la media por día del mes para todos los años comprendidos entre 2015 y 2019 (ambos incluidos).

 df_2015_2019<- df %>% filter(Year!=2020)
 meanLAeqByDayMonthStationAndPeriod_2015_2019 <- df_2015_2019 %>%
  group_by(DayMonthName, StationName, Period) %>% 
  summarise(meanLAeqByDayMonth_2015_2019 = mean(LAeq))
head(meanLAeqByDayMonthStationAndPeriod_2015_2019)

Creamos el dataframe para el año 2020 y añadimos el resultado de la media del índice LAeq promediada por tipo de día del mes. Cortamos el dataframe para quedarnos únicamente con los días comprendidos entre los meses marzo-mayo, ambos incluidos. Además, solo nos interesa el Periodo ‘T’.

df2020 <- df %>% filter(Year==2020) %>% filter(Period=='T')
dfCovidEffect <- merge(df2020, meanLAeqByDayMonthStationAndPeriod_2015_2019, by= c("DayMonthName", "StationName", "Period"), x.ALL = True)
dfCovidEffect <- dfCovidEffect %>% filter(Month>2, Month<6) 
dfCovidEffect <- dfCovidEffect[, c('Date', 'StationName','LAeq', 'meanLAeqByDayMonth_2015_2019')]
colnames(dfCovidEffect) <- c("Date","StationName","LAeq_2020","LAeq_2015_2019")
head(dfCovidEffect)
# Melt the dataframe in order to obtain anot
dfCovidEffectMelted <- reshape2::melt(dfCovidEffect, id.var=c('Date', 'StationName'))
head(dfCovidEffectMelted)
# Renamce third column name
colnames(dfCovidEffectMelted)[3] <- "LAeq"

Como se aprecia en la gráfica siguiente, el efecto del confinamiento ha tenido como resultado un claro descenso de los niveles de ruido en todas las estaciones de Madrid. En verde está representada la región correspondiente al periodo de distanciamiento social (teletrabajo para la mayoría de los sectores, prohibición de salir de casa si no era a comprar), mientras que la roja, además del distanciamiento social, se hibernó la economía durante dos semanas. Esta última restricción hizo que la movilidad en Madrid se redujera drásticamente, provocando, a su vez, un descenso en los niveles de ruido registrados en todas las estaciones.

ggplot(dfCovidEffectMelted, aes(x = Date, y = value, col=LAeq)) +
  geom_point(color='black',size=1)  +
  geom_line()  +
  geom_rect(aes(xmin = as.Date("2020-03-16"), xmax = as.Date("2020-03-30"),ymin = -Inf, ymax = Inf),
                   fill = "green", alpha = 0.002) +
  geom_rect(aes(xmin = as.Date("2020-03-30"), xmax = as.Date("2020-04-13"),ymin = -Inf, ymax = Inf),
                   fill = "red", alpha = 0.002) +
  geom_rect(aes(xmin = as.Date("2020-04-13"), xmax = as.Date("2020-04-26"),ymin = -Inf, ymax = Inf),
                   fill = "green", alpha = 0.002) +
  facet_wrap(~ StationName, ncol = 3, scales="free") +
  labs(title = "Comparación del índice de ruido LAeq diario para 2020 y la media de los años 2015-2019",
       subtitle = "(La media de los años 2015-2019 ha sido calculada para obtener una semana 'tipo')", y = "LAeq") +
 theme(legend.position="top")

LS0tCnRpdGxlOiAiQW7DoWxpc2lzIGRlbCBydWlkbyBlbiBNYWRyaWQiCm91dHB1dDogCiAgICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgICBodG1sX25vdGVib29rOiBkZWZhdWx0IAotLS0KCkVzdGUgbm90ZWJvb2sgcHJlc2VudGEgdW4gYW7DoWxpc2lzIGRlbCDDrW5kaWNlIGRlIHJ1aWRvICRMQV97ZXF9XnsoaSl9JCBlbiBsYSBjaXVkYWQgZGUgTWFkcmlkIHBhcmEgbG9zIGHDsW9zIDIwMTUtMjAxOSwgYW1ib3MgaW5jbHVpZG9zLCB5IGVsIGHDsW8gMjAyMCBoYXN0YSBlbCBtZXMgZGUgbWF5by4gCgooMSkgRW4gbGEgcHJpbWVyYSBwYXJ0ZSBzZSBwcmVzZW50YW4gdW5hIGNvbXBhcmF0aXZhIGRlIGxhcyAzMSBlc3RhY2lvbmVzIHByZXNlbnRlcyBlbiBsYSBjYXBpdGFsLiBPYnNlcnZhcmVtb3MgY8OzbW8gZWwgcnVpZG8gZXMgZXN0YWNpb25hbCBlbiBwcsOhY3RpY2FtZW50ZSB0b2RhcyBlbGxhcywgbGFzIG9yZGVuYXJlbW9zIGRlIGFjdWVyZG8gYWwgcnVpZG8gbWVkaW8gZGlhcmlvIHF1ZSByZWdpc3RyYW4geSB2ZXJlbW9zLCBtZWRpYW50ZSB1biBncsOhZmljbyBkZSB2aW9sw61uLCBsYXMgZGVzdmlhY2lvbmVzIGRlIHRvZG9zIGxvcyByZWdpc3Ryb3MgY29uIHJlc3BlY3RvIGEgbGEgbWVkaWEgZGlhcmlhIHBhcmEgY2FkYSB1bmEgZGUgbGFzIGVzdGFjaW9uZXMuIAoKKDIpIEVuIGxhIHNlZ3VuZGEgcGFydGUsIGNvbXBhcmFyZW1vcyBsYSBldm9sdWNpw7NuIGRlIGxhIG1lZGlhIG1lbnN1YWwgZGVsIMOtbmRpY2UgJExBX3tlcX0kIHBhcmEgbGFzIGRpc3RpbnRhcyBlc3RhY2lvbmVzLCBwZXJtaXRpw6luZG9ub3Mgb2JzZXJ2YXIgdW4gY2xhcm8gZGVzY2Vuc28gZW4gZWwgYcOxbyAyMDIwIGRlYmlkbyBhIGxhcyBtZWRpZGFzIGRlIGFpc2xhbWllbnRvIGVzdGFibGVjaWRhcyBwb3IgbGEgY3Jpc2lzIGRlIGxhIHBhbmRlbWlhIENPVklELTE5LiBQb3N0ZXJpb3JtZW50ZSwgZGVzY2VuZGVyZW1vcyBhIHVuYSBlc2NhbGEgZGlhcmlhIHBhcmEgYW5hbGl6YXIgZW4gZGV0YWxsZSBlbCBlZmVjdG8gZGUgbGFzIGRpc3RpbnRhcyBldGFwYXMgZGVsIGFpc2xhbWllbnRvIHNvYnJlIGVsIHJ1aWRvIHJlZ2lzdHJhZG8gZW4gbGFzIGVzdGFjaW9uZXMgZGUgTWFkcmlkLiAKCgppIEVsIMOtbmRpY2UgZGUgcnVpZG8gJExBX3tlcX0kIGVzIGVsIHBhcsOhbWV0cm8gYWPDunN0aWNvIGFjZXB0YWRvIGludGVybmFjaW9uYWxtZW50ZSBjb21vIG1lZGlkYSBkZWwgbml2ZWwgc29ub3JvIGNvbnRpbnVvIGVxdWl2YWxlbnRlLiBFc3RlIMOtbmRpY2UgcmVwcmVzZW50YSBsYSBjb250YW1pbmFjacOzbiBhY8O6c3RpY2EgYWN1bXVsYWRhIGEgbG8gbGFyZ28gZGUgdW4gcGVyaW9kbyBkZSB0aWVtcG8gZW4gZWwgbHVnYXIgZGUgbWVkaWNpw7NuLiBQdWVzdG8gcXVlIGVsIG/DrWRvIGh1bWFubyBlcyBtw6FzIHNlbnNpYmxlIGEgbGFzIG1lZGlhcyBmcmVjdWVuY2lhcywgc2UgcmVhbGl6YSB1bmEgcG9uZGVyYWNpw7NuIGRlIGZyZWN1ZW5jaWFzLCBkYW5kbyBtZW5vcyBpbXBvcnRhbmNpYSBhIGxhcyBiYWphcyB5IGFsdGFzIGZyZWN1ZW5jaWFzIGZyZW50ZSBhIGxhcyBtZWRpYXMsIGNvbiBlbCBmaW4gZGUgZXN0YWJsZWNlciB1bmEgbWVkaWRhIGRlbCBuaXZlbCBkZSBydWlkbyBxdWUgc29wb3J0YSBlbCBzZXIgaHVtYW5vIGNlcmNhbm8gYSBsYSBlc3RhY2nDs24gZGUgbWVkaWNpw7NuLiAKCgpBbsOhbGlzaXMgcmVhbGl6YWRvIHBvciBbQ2xhdWRpYSBHdXRpw6lycmV6XShodHRwczovL2dpdGh1Yi5jb20vQ2xhdWRpYUdFc2NyaWJhbm8pIHkgW0RpZWdvIER1cXVlXShodHRwczovL2dpdGh1Yi5jb20vZGR6dW1ham8pCgoKTG9zIGRhdG9zIGhhbiBzaWRvIG9idGVuaWRvIGRlbCBbUG9ydGFsIGRlIGRhdG9zIGFiaWVydG9zIGRlbCBBeXVudGFtaWVudG8gZGUgTWFkcmlkXShodHRwczovL2RhdG9zLm1hZHJpZC5lcy9wb3J0YWwvc2l0ZS9lZ29iL21lbnVpdGVtLmMwNWMxZjc1NGEzM2E5ZmJlNGIyZTRiMjg0ZjFhNWEwLz92Z25leHRvaWQ9MmVjODkyODc0ODcwYjQxMFZnblZDTTEwMDAwMDBiMjA1YTBhUkNSRCZ2Z25leHRjaGFubmVsPTM3NDUxMmI5YWNlOWYzMTBWZ25WQ00xMDAwMDAxNzFmNWEwYVJDUkQmdmduZXh0Zm10PWRlZmF1bHQpLgoKYGBge3J9CmxpYnJhcnkoImRwbHlyIikKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoImdyaWRFeHRyYSIpCmxpYnJhcnkoInJlc2hhcGUyIikKbGlicmFyeSgibWFncml0dHIiKQpsaWJyYXJ5KCJsYXR0aWNlIikKbGlicmFyeSgibGF0dGljZUV4dHJhIikKbGlicmFyeSgiem9vIikKbGlicmFyeSgidmlyaWRpcyIpCmBgYAoKYGBge3J9ClN5cy5zZXRsb2NhbGUoIkxDX1RJTUUiLCAiZW5fVVMuVVRGLTgiKQpgYGAKCmBgYHtyfQojIFNldCB0aGUgbWluaW1hbCBzZXQgZm9yIHRoZSBncmFwaHMKdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSkKYGBgCgoKYGBge3J9CgojIExvYWQgZGF0YQpkZiA8LSByZWFkLmNzdihmaWxlID0gJy4vZGF0YS9kYXRvc19ydWlkb19tYWRyaWQuY3N2JywgaGVhZGVyID0gRkFMU0UsIHNlcCA9ICc7Jywgc3RyaXAud2hpdGUgPSBUUlVFKQoKIyBSZW5hbWUgY29sdW1ucwpjb2xuYW1lcyhkZikgPC0gYygiU3RhdGlvbiIsIlllYXIiLCJNb250aCIsIkRheSIsIlBlcmlvZCIsIkxBZXEiLCJMQVMwMSIsIkxBUzEwIiwiTEFTNTAiLCJMQVM5MCIsIkxBUzk5IikKCiMgQ3JlYXRlIGNvbHVtbiBkYXRlCmRmJERhdGUgPC0gYXMuRGF0ZSh3aXRoKGRmLCBwYXN0ZShZZWFyLCBNb250aCwgRGF5LHNlcD0iLSIpKSwgIiVZLSVtLSVkIikKCiMgQ3JlYXRlIGNvbHVtbiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBtb250aHMKZGYkTW9udGhOYW1lIDwtIG1vbnRocyhkZiREYXRlKQoKIyBDcmVhdGUgY29sdW1uIHdpdGggZGF5IG9mIHdlZWsgYW5kIG1vbnRoLiAKZGYkRGF5TW9udGhOYW1lIDwtIHdpdGgoZGYsIHBhc3RlKHdlZWtkYXlzKGRmJERhdGUpLCBNb250aE5hbWUsc2VwPSItIikpCgojIERlbGV0ZSB1c2VsZXNzIGNvbHVtbnMKZGYkTEFTMDEgPC0gTlVMTApkZiRMQVMxMCA8LSBOVUxMCmRmJExBUzUwIDwtIE5VTEwKZGYkTEFTOTAgPC0gTlVMTApkZiRMQVM5OSA8LSBOVUxMCgoKaGVhZChkZikKYGBgCgpgYGB7cn0KCiMgTG9hZCBzdGF0aW9ucyBmaWxlCmRmcyA8LSByZWFkLmNzdihmaWxlID0gJy4vZGF0YS9Fc3RhY2lvbmVzTWVkaWRhQ29udHJvbEFjdXN0aWNvLmNzdicsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICcsJywgc3RyaXAud2hpdGUgPSBUUlVFLCBmaWxlRW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpCgojIERlbGV0ZSB1c2VsZXNzIGNvbHVtbnMKZGZzWyAsYygnQ09EX1ZJQScsICdWSUFfQ0xBU0UnLCdWSUFfUEFSJywnVklBX05PTUJSRScsJ0RpcmVjY2nDs24nLCdMb25naXR1ZF9nbXMnLCdMYXRpdHVkX2dtcycsJ0xBVElUVURfRUQ1MCcsJ0xPTkdJVFVEX0VENTAnLCdBbHQuLm0uJywnRmVjaGEuYWx0YScsJ0Nvb3JkZW5hZGFfWF9FVFJTODknLCdDb29yZGVuYWRhX1lfRVRSUzg5JywnTE9OR0lUVURfV0dTODQnLCdMQVRJVFVEX1dHUzg0JywnWC4yJywnWC4zJyldIDwtIGxpc3QoTlVMTCkKCiMgUmVuYW1lIHNvbWUgY29sdW1ucwpkZnMgPC0gZGZzICU+JSAKICByZW5hbWUoCiAgICBTdGF0aW9uPU7CuiwKICAgIFN0YXRpb25OYW1lID0gTm9tYnJlLAogICAgTG9uZyA9IFgsIAogICAgTGF0ID0gWC4xCiAgICApCgpoZWFkKGRmcykKCmBgYAoKCmBgYHtyfQoKIyBNZXJnZSBkYXRhZnJhbWVzCmRmIDwtIG1lcmdlKGRmLCBkZnMsIGJ5ID0gIlN0YXRpb24iLCBhbGwueCA9IFRSVUUpCgojIFNvcnQgb3V0cHV0IGRhdGFmcmFtZQpkZiA8LSBkZltvcmRlcihkZiREYXRlKSxdCgpoZWFkKGRmKQoKYGBgCgpBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYW4gbG9zIHJlZ2lzdHJvcyBkZWwgw61uZGljZSAkTEFfe2VxfSQgbWVkaWRvcyBwb3IgdG9kYXMgbGFzIGVzdGFjaW9uZXMgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MgcGFyYSBsb3MgZGlzdGludG9zIHBlcmlvZG9zLiBTZSBvYnNlcnZhIHF1ZSBkdXJhbnRlIGxhcyBub2NoZXMgKE4pIGVsIMOtbmRpY2UgZXMgaW5mZXJpb3IgZW4gdG9kYXMgbGEgZXN0YWNpb25lcy4gUG9yIG90cm8gbGFkbywgZW4gYWxndW5hcyBlc3RhY2lvbmVzIGFwZW5hcyBoYXkgZGlzdGluY2nDs24gZW4gZWwgw61uZGljZSBkZSBydWlkbyBtZWRpZG8gZW4gbG9zIHBlcmlvZG9zIEQgeSBFIChtYcOxYW5hIHkgdGFyZGUsIHJlc3BlY3RpdmFtZW50ZSkuCgpBZGVtw6FzLCBzZSBhcHJlY2lhIGNvbiBjbGFyaWRhZCBjw7NtbyBlbCDDrW5kaWNlIGRlIHJ1aWRvIGVzIGVzdGFjaW9uYWwgKHNlIHJlcGl0ZSBlbCBtaXNtbyBwYXRyw7NuIGRlIGHDsW8gZW4gYcOxbyksIHNpIGJpZW4gc2Ugb2JzZXJ2YW4gZGlmZXJlbmNpYXMgcGFyYSBlbCBhw7FvIDIwMjAgZGViaWRvIGEgbGFzIG1lZGlkYXMgZGUgY29uZmluYW1pZW50byBwYXJhIHBhbGlhciBlbCBlZmVjdG8gZGUgbGEgcGFuZGVtaWEgQ09WSUQtMTkuCgpMb3MgcGljb3Mgb2JzZXJ2YWRvcyBzZWd1cmFtZW50ZSBzZWFuIGRlYmlkb3MgYSBlcnJvcmVzIGVuIGxhIG1lZGljacOzbiBkZWwgcnVpZG8uIAoKYGBge3IsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTh9CmdncGxvdChkZltkZiRQZXJpb2QgIT0gIlQiLCBdLCBhZXMoeCA9IERhdGUsIHkgPSBMQWVxLCBncm91cD1QZXJpb2QpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj1QZXJpb2QpLCBhbHBoYT0wLjgsIGx3ZCA9IDAuMykgICsKICBmYWNldF93cmFwKH4gU3RhdGlvbk5hbWUsIG5jb2wgPSAzLCBzY2FsZXM9ImZyZWVfeCIpICsKICB5bGltKDMwLDkwKSArCiAgbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlbCDDrW5kaWNlIExBZXEgcGFyYSBsb3MgcGVyaW9kb3MgZMOtYSAoRCksIHRhcmRlIChFKSB5IG5vY2hlIChOKSIsIHkgPSAiTEFlcSIpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAieWVhcnMiLCBkYXRlX2xhYmVscyA9ICIlWSIpCmBgYAoKUmVhbGl6YW1vcyBsYSBtZWRpYSBkZWwgw61uZGljZSAkTEFfe2VxfSQgZW4gZWwgcGVyaW9kbyBUIGEgbG8gbGFyZ28gZGUgbG9zIGHDsW9zIDIwMTUtMjAxOSAoYW1ib3MgaW5jbHVpZG9zKSBwYXJhIGNhZGEgdW5hIGRlIGxhcyBlc3RhY2lvbmVzLiBEZSBlc3RhIG1hbmVyYSBwb2RlbW9zIHZlciBjdcOhbGVzIHNvbiBsYXMgZXN0YWNpb25lcyBxdWUgZ2VuZXJhbG1lbnRlIHNvbiBtw6FzIHJ1aWRvc2FzLgoKYGBge3J9CmRmVG9QbG90IDwtZGYgJT4lIAogIGZpbHRlcihZZWFyICE9IDIwMjApICU+JQogIGZpbHRlcihQZXJpb2QgPT0gIlQiKSAlPiUKICBncm91cF9ieShTdGF0aW9uTmFtZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fTEFlcSA9IG1lYW4oTEFlcSkpCgpnZ3Bsb3QoZGZUb1Bsb3QsYWVzKHk9cmVvcmRlcihTdGF0aW9uTmFtZSwgbWVhbl9MQWVxLCBtZWFuKSx4PW1lYW5fTEFlcSwgY29sb3I9bWVhbl9MQWVxKSkgKwogIGdlb21fcG9pbnQoY2V4PTIuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gIkQiKSArCiAgbGFicyh5PSJTdGF0aW9ucyIsIHggPSAiTWVhbiBMQWVxIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCmBgYAoKYGBge3J9CmRmICU+JQogIGZpbHRlcihZZWFyICE9IDIwMjApICU+JQogICAgZmlsdGVyKFBlcmlvZCA9PSAiVCIpICU+JQogICAgZ3JvdXBfYnkoU3RhdGlvbikgJT4lCiAgZ2dwbG90KGFlcyh4PXJlb3JkZXIoU3RhdGlvbk5hbWUsIExBZXEsIG1lYW4pLCB5PUxBZXEpKSArCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkgKwogIGdlb21fYm94cGxvdCh3aWR0aD0wLjIsIG91dGxpZXIuc2hhcGU9TkEpICsKICBsYWJzKGNvbG9yPSdTdGF0aW9uJywgeD0nJykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQpgYGAKCgpEZXNwdcOpcyBkZSBlc3RlIGFuw6FsaXNpcyBnZW5lcmFsIG5vcyBjZW50cmFtb3Mgw7puaWNhbWVudGUgZW4gZWwgcGVyaW9kbyBULiBDb21lbnphcmVtb3MgY2FsY3VsYW5kbyBsYSBtZWRpYSBtZW5zdWFsIGRlbCDDrW5kaWNlICRMQV97ZXF9JCBwYXJhIHRvZG9zIGxvcyBhw7FvcyB5IGVzdGFjaW9uZXMuIERlIGVzdGEgbWFuZXJhIG5vcyBwZXJtaXRpcsOhIGFuYWxpemFyIGdyb3NzbyBtb2RvIGxhcyBkaWZlcmVuY2lhcyB5IHNpbWlsaXR1ZGVzIGVudHJlIGxvcyBhw7FvcyAyMDE0LTIwMjAgKGFtYm9zIGluY2x1aWRvcykuCgoKYGBge3J9CgojIENvbXB1dGUgdGhlIG1lYW4gb2YgdGhlIGluZGV4IGJ5IHllYXIsIG1vbnRoLCBzdGF0aW9uIGFuZCBwZXJpb2QKbWVhbkxBZXFCeU1vbnRoU3RhdGlvbkFuZFBlcmlvZCA8LSBkZiAlPiUgCiAgICBncm91cF9ieShZZWFyLE1vbnRoTmFtZSwgU3RhdGlvbk5hbWUsIFBlcmlvZCkgJT4lIAogICAgc3VtbWFyaXNlKG1lYW5MQWVxQnlNb250aCA9IG1lYW4oTEFlcSkpCgojIE1lcmdlIGRhdGFmcmFtZXMKZGYgPC0gbWVyZ2UoZGYsIG1lYW5MQWVxQnlNb250aFN0YXRpb25BbmRQZXJpb2QsIGJ5ID0gYygiWWVhciIsIk1vbnRoTmFtZSIsICJTdGF0aW9uTmFtZSIsICJQZXJpb2QiKSwgYWxsLnggPSBUUlVFKQoKaGVhZChkZikKYGBgCgoKYGBge3J9CgojIEZpbHRlciBwZXJpb2QKIGRmUGVyaW9kVCA8LSBkZiAlPiUgZmlsdGVyKFBlcmlvZCA9PSAiVCIpCgojIFRha2Ugb25seSB0aGUgdW5pcXVlIGRhdGEKZGZNZWFuTEFlcUJ5TW9udGggPC0gZGlzdGluY3QoZGZQZXJpb2RULCBZZWFyLCBNb250aE5hbWUsIFN0YXRpb25OYW1lLCBtZWFuTEFlcUJ5TW9udGgpCgojIFllYXIgYXMgZmFjdG9yIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgdGhlIGNob2ljZSBvZiBjb2xvcnMgaW4gdGhlIHBsb3QKZGZNZWFuTEFlcUJ5TW9udGgkWWVhciA8LSBmYWN0b3IoZGZNZWFuTEFlcUJ5TW9udGgkWWVhcikKCmBgYAoKCkRlIGxhIGdyw6FmaWNhIHNpZ3VpZW50ZSBzZSBwdWVkZW4gZXh0cmFlciBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXMgY29uY2x1c2lvbmVzOgoKMS4gTGEgY3VydmEgZGVsIHJ1aWRvIHByb21lZGlhZGEgbWVuc3VhbG1lbnRlIHRpZW5lIHVuYSBlc3RydWN0dXJhIHNpbWlsYXIgYcOxbyB0cmFzIGHDsW8gcGFyYSBwcsOhY3RpY2FtZW50ZSB0b2RhcyBsYXMgZXN0YWNpb25lcy4gCgoyLiBTZSBwdWVkZSBhcHJlY2lhIHVuIGxpZ2VybyBkZXNjZW5zbyBlbiBlbCBydWlkbyBkdXJhbnRlIGVsIGHDsW8gMjAxOSBlbiBlc3RhY2lvbmVzIGNvbW8gUGxhemEgZGUgRXNwYcOxYSwgTWFudWVsIEJlY2VycmEsIEVtYmFqYWRhLiBQb2Ryw61hIHBlbnNhcnNlIHF1ZSBlbCBlZmVjdG8gZGUgTWFkcmlkIENlbnRyYWwgbGxlZ2FyYSBoYXN0YSBkaWNoYXMgZXN0YWNpb25lcyBzaSB0dXZpw6lyYW1vcyBtw6FzIGHDsW9zIChwcmV2aW9zIHkgcG9zdGVyaW9yZXMgYSBNYWRyaWQgQ2VudHJhbCkuIAoKCjMuIEVsIGHDsW8gMjAyMCBjb21lbnrDsyBkZSBmb3JtYSBzaW1pbGFyIGFsIHJlc3RvIGRlIGHDsW9zLiBTaW4gZW1iYXJnbywgYSBwYXJ0aXIgZGUgYWJyaWwsIGxvcyBuaXZlbGVzIGRlIHJ1aWRvIGRlc2NlbmRpZXJvbiBkZWJpZG8gYSBsYXMgbWVkaWRhcyBkZSBjb25maW5hbWllbnRvLiAKCgpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQoKZ2dwbG90KGRmTWVhbkxBZXFCeU1vbnRoLCBhZXMoeCA9IG9yZGVyZWQoTW9udGhOYW1lLGxldmVscz1tb250aC5uYW1lKSwgeSA9IG1lYW5MQWVxQnlNb250aCwgZ3JvdXA9WWVhcikpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvcj1ZZWFyKSwgc2l6ZT0yKSAgKwogIGdlb21fbGluZShhZXMoY29sb3I9WWVhcikpICArCiAgZmFjZXRfd3JhcCh+IFN0YXRpb25OYW1lLCBuY29sID0gMywgc2NhbGVzPSJmcmVlIikgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlbCDDrW5kaWNlIExBZXEgbWVkaWRvIGVuIGxhcyBkaXN0aW50YXMgZXN0YWNpb25lcyBhIGxvIGxhcmdvIGRlIGxvcyBhw7FvcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJTZSBoYSByZWFsaXphZG8gbGEgbWVkaWEgbWVuc3VhbCBkZSBsb3MgZGF0b3MgcmVjb3BpbGFkb3MgZW4gY2FkYSB1bmEgZGUgbGFzIGVzdGFjaW9uZXMiLAogICAgICAgeSA9ICJNb250aGx5IG1lYW4gTEFlcSIsIHggPSAnTW9udGgnKSArCiB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIpCmBgYAoKVW5hIHZleiBxdWUgaGVtb3MgdmlzdG8gY8OzbW8gZWwgZWZlY3RvIGRlIGxhIGN1YXJlbnRlbmEgZGViaWRvIGFsIGNvcm9uYXZpcnVzIHNlIHJlZmxlamEgZW4gbG9zIG5pdmVsZXMgZGUgcnVpZG8sIG5vcyBjZW50cmFtb3Mgw7puaWNhbWVudGUgZW4gZWwgcGVyaW9kbyBkZSB0aWVtcG8gZHVyYW50ZSBlbCBjdWFsIGZ1ZXJvbiBhcGxpY2FkYXMgbGFzIG1lZGlkYXMgZGUgY29uZmluYW1pZW50byBlIGhpYmVybmFjacOzbiBkZSBsYSBlY29ub23DrWEuIFBhcmEgZWxsbyBlc3R1ZGlhcmVtb3MgbG9zIG5pdmVsZXMgZGUgcnVpZG8gY29uIHVuIG5pdmVsIGRlIGRlc2NyaXBjacOzbiBzZW1hbmFsLiAKClBhcmEgZWxsbyBjcmVhcmVtb3Mgb2J0ZW5kcmVtb3MgbG9zIHByb21lZGlvcyBkaWFyaW9zIGRlIGxvcyDDrW5kaWNlcyBkZSBsb3MgYcOxb3MgMjAxNS0yMDE5IHRlbmllbmRvIGVuIGN1ZW50YSBsYXMgc2lndWllbnRlcyBwcmVtaXNhczogCgoxLiBMb3MgcHJvbWVkaW9zIHNlIHRpZW5lbiBxdWUgcmVhbGl6YXIgbm8gcG9yIGZlY2hhIHNpbm8gcG9yIGTDrWFzIChpLmUuIHNlIHByb21lZGlhbiBsb3MgZMOtYXMgZGUgbGEgc2VtYW5hIGRlIHVuIG1pc21vIG1lcykuIEFzw60gcHVlcywgdG9tYXJlbW9zLCBwb3IgZWplbXBsbywgdG9kb3MgbG9zIGx1bmVzIGRlIHVuIG1pc21vIG1lcyBkZSBsb3MgZGlzdGludG9zIGHDsW9zIHBhcmEgcmVhbGl6YXIgZWwgcHJvbWVkaW8geSBvYnRlbmVyIHVuIGx1bmVzICJ0w61waWNvIiBkZWwgbWVzIGVuIGN1ZXN0acOzbi4gCgoyLiBDb25zdHJ1aXJlbW9zIHVuIG1lcyAidMOtcGljbyIgcGFyYSBjb21wYXJhcmxvIGNvbiBlbCBtZXMgY29ycmVzcG9uZGllbnRlIGRlIDIwMjAuIAoKMy4gRWwgZWZlY3RvIGRlIE1hZHJpZCBjZW50cmFsIG9ic2VydmFkbyBlbiBsYSBncsOhZmljYSBhbnRlcmlvciBubyB2YSBhIHNlciB0ZW5pZG8gZW4gY3VlbnRhIHlhIHF1ZSB2YW1vcyBhIHByb21lZGlhciBzb2JyZSB0b2RvcyBsb3MgYcOxb3MgcHJldmlvcyBhbCBkZSBsYSBjcmlzaXMgZGVsIGNvcm9uYXZpcnVzLiAKCmBgYHtyfQpoZWFkKGRmKQpgYGAKCkNhbGN1bGFtb3MgbGEgbWVkaWEgcG9yIGTDrWEgZGVsIG1lcyBwYXJhIHRvZG9zIGxvcyBhw7FvcyBjb21wcmVuZGlkb3MgZW50cmUgMjAxNSB5IDIwMTkgKGFtYm9zIGluY2x1aWRvcykuCgpgYGB7cn0KCiBkZl8yMDE1XzIwMTk8LSBkZiAlPiUgZmlsdGVyKFllYXIhPTIwMjApCgogbWVhbkxBZXFCeURheU1vbnRoU3RhdGlvbkFuZFBlcmlvZF8yMDE1XzIwMTkgPC0gZGZfMjAxNV8yMDE5ICU+JQogIGdyb3VwX2J5KERheU1vbnRoTmFtZSwgU3RhdGlvbk5hbWUsIFBlcmlvZCkgJT4lIAogIHN1bW1hcmlzZShtZWFuTEFlcUJ5RGF5TW9udGhfMjAxNV8yMDE5ID0gbWVhbihMQWVxKSkKCmhlYWQobWVhbkxBZXFCeURheU1vbnRoU3RhdGlvbkFuZFBlcmlvZF8yMDE1XzIwMTkpCmBgYAoKQ3JlYW1vcyBlbCBkYXRhZnJhbWUgcGFyYSBlbCBhw7FvIDIwMjAgeSBhw7FhZGltb3MgZWwgcmVzdWx0YWRvIGRlIGxhIG1lZGlhIGRlbCDDrW5kaWNlIExBZXEgcHJvbWVkaWFkYSBwb3IgdGlwbyBkZSBkw61hIGRlbCBtZXMuIENvcnRhbW9zIGVsIGRhdGFmcmFtZSBwYXJhIHF1ZWRhcm5vcyDDum5pY2FtZW50ZSBjb24gbG9zIGTDrWFzIGNvbXByZW5kaWRvcyBlbnRyZSBsb3MgbWVzZXMgbWFyem8tbWF5bywgYW1ib3MgaW5jbHVpZG9zLiBBZGVtw6FzLCBzb2xvIG5vcyBpbnRlcmVzYSBlbCBQZXJpb2RvICdUJy4gCgpgYGB7cn0KCmRmMjAyMCA8LSBkZiAlPiUgZmlsdGVyKFllYXI9PTIwMjApICU+JSBmaWx0ZXIoUGVyaW9kPT0nVCcpCgpkZkNvdmlkRWZmZWN0IDwtIG1lcmdlKGRmMjAyMCwgbWVhbkxBZXFCeURheU1vbnRoU3RhdGlvbkFuZFBlcmlvZF8yMDE1XzIwMTksIGJ5PSBjKCJEYXlNb250aE5hbWUiLCAiU3RhdGlvbk5hbWUiLCAiUGVyaW9kIiksIHguQUxMID0gVHJ1ZSkKCmRmQ292aWRFZmZlY3QgPC0gZGZDb3ZpZEVmZmVjdCAlPiUgZmlsdGVyKE1vbnRoPjIsIE1vbnRoPDYpIAoKZGZDb3ZpZEVmZmVjdCA8LSBkZkNvdmlkRWZmZWN0WywgYygnRGF0ZScsICdTdGF0aW9uTmFtZScsJ0xBZXEnLCAnbWVhbkxBZXFCeURheU1vbnRoXzIwMTVfMjAxOScpXQoKY29sbmFtZXMoZGZDb3ZpZEVmZmVjdCkgPC0gYygiRGF0ZSIsIlN0YXRpb25OYW1lIiwiTEFlcV8yMDIwIiwiTEFlcV8yMDE1XzIwMTkiKQoKCmhlYWQoZGZDb3ZpZEVmZmVjdCkKCmBgYAoKYGBge3J9CgojIE1lbHQgdGhlIGRhdGFmcmFtZSBpbiBvcmRlciB0byBvYnRhaW4gYW5vdApkZkNvdmlkRWZmZWN0TWVsdGVkIDwtIHJlc2hhcGUyOjptZWx0KGRmQ292aWRFZmZlY3QsIGlkLnZhcj1jKCdEYXRlJywgJ1N0YXRpb25OYW1lJykpCgpoZWFkKGRmQ292aWRFZmZlY3RNZWx0ZWQpCmBgYAoKYGBge3J9CgojIFJlbmFtY2UgdGhpcmQgY29sdW1uIG5hbWUKY29sbmFtZXMoZGZDb3ZpZEVmZmVjdE1lbHRlZClbM10gPC0gIkxBZXEiCgpgYGAKCkNvbW8gc2UgYXByZWNpYSBlbiBsYSBncsOhZmljYSBzaWd1aWVudGUsIGVsIGVmZWN0byBkZWwgY29uZmluYW1pZW50byBoYSB0ZW5pZG8gY29tbyByZXN1bHRhZG8gdW4gY2xhcm8gZGVzY2Vuc28gZGUgbG9zIG5pdmVsZXMgZGUgcnVpZG8gZW4gdG9kYXMgbGFzIGVzdGFjaW9uZXMgZGUgTWFkcmlkLiBFbiB2ZXJkZSBlc3TDoSByZXByZXNlbnRhZGEgbGEgcmVnacOzbiBjb3JyZXNwb25kaWVudGUgYWwgcGVyaW9kbyBkZSBkaXN0YW5jaWFtaWVudG8gc29jaWFsICh0ZWxldHJhYmFqbyBwYXJhIGxhIG1heW9yw61hIGRlIGxvcyBzZWN0b3JlcywgcHJvaGliaWNpw7NuIGRlIHNhbGlyIGRlIGNhc2Egc2kgbm8gZXJhIGEgY29tcHJhciksIG1pZW50cmFzIHF1ZSBsYSByb2phLCBhZGVtw6FzIGRlbCBkaXN0YW5jaWFtaWVudG8gc29jaWFsLCBzZSBoaWJlcm7DsyBsYSBlY29ub23DrWEgZHVyYW50ZSBkb3Mgc2VtYW5hcy4gRXN0YSDDumx0aW1hIHJlc3RyaWNjacOzbiBoaXpvIHF1ZSBsYSBtb3ZpbGlkYWQgZW4gTWFkcmlkIHNlIHJlZHVqZXJhIGRyw6FzdGljYW1lbnRlLCBwcm92b2NhbmRvLCBhIHN1IHZleiwgdW4gZGVzY2Vuc28gZW4gbG9zIG5pdmVsZXMgZGUgcnVpZG8gcmVnaXN0cmFkb3MgZW4gdG9kYXMgbGFzIGVzdGFjaW9uZXMuIAoKCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CgpnZ3Bsb3QoZGZDb3ZpZEVmZmVjdE1lbHRlZCwgYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbD1MQWVxKSkgKwogIGdlb21fcG9pbnQoY29sb3I9J2JsYWNrJyxzaXplPTEpICArCiAgZ2VvbV9saW5lKCkgICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSBhcy5EYXRlKCIyMDIwLTAzLTE2IiksIHhtYXggPSBhcy5EYXRlKCIyMDIwLTAzLTMwIikseW1pbiA9IC1JbmYsIHltYXggPSBJbmYpLAogICAgICAgICAgICAgICAgICAgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC4wMDIpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSBhcy5EYXRlKCIyMDIwLTAzLTMwIiksIHhtYXggPSBhcy5EYXRlKCIyMDIwLTA0LTEzIikseW1pbiA9IC1JbmYsIHltYXggPSBJbmYpLAogICAgICAgICAgICAgICAgICAgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuMDAyKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gYXMuRGF0ZSgiMjAyMC0wNC0xMyIpLCB4bWF4ID0gYXMuRGF0ZSgiMjAyMC0wNC0yNiIpLHltaW4gPSAtSW5mLCB5bWF4ID0gSW5mKSwKICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JlZW4iLCBhbHBoYSA9IDAuMDAyKSArCiAgZmFjZXRfd3JhcCh+IFN0YXRpb25OYW1lLCBuY29sID0gMywgc2NhbGVzPSJmcmVlIikgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlbCDDrW5kaWNlIGRlIHJ1aWRvIExBZXEgZGlhcmlvIHBhcmEgMjAyMCB5IGxhIG1lZGlhIGRlIGxvcyBhw7FvcyAyMDE1LTIwMTkiLAogICAgICAgc3VidGl0bGUgPSAiKExhIG1lZGlhIGRlIGxvcyBhw7FvcyAyMDE1LTIwMTkgaGEgc2lkbyBjYWxjdWxhZGEgcGFyYSBvYnRlbmVyIHVuYSBzZW1hbmEgJ3RpcG8nKSIsIHkgPSAiTEFlcSIpICsKIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikKYGBgCgo=